Plot_LoadLibrary <- function() {
  #load libraries
  lib <- c("ggplot2","rgl","ellipse","BioPhysConnectoR","grid","gridExtra","tcltk","lattice","reshape2","plyr","scales","colorspace","scatterplot3d")
  for (i in 1:length(lib)) {
    E<-lib[i]
    if(!(paste0("package:",E,sep="") %in% search())){
      if(!require(E,character.only=T)){
        if(!isTRUE(install.packages(E))){print(paste("Please install the package per 'R CMD INSTALL':",E))}
      }
    } 
  } 
}

source('StatFunc.R')
Plot_LoadLibrary()

Spec_iGEM_Plot.R<-function(){}

Save2D_Vec<-function(Vec,Name,x_set="",lab=c(),discret=T){###
  #set_col<-get_tick_V(Vec,x_set)
  DF.Vec<-data.frame(x=seq(1,length(Vec),1),y=Vec)
  
  if (discret){bsize<-variation_span(Vec)}else{bsize<-1}
  if (length(lab)==0){lab<-c("x","y")}
  gp2d<-ggplot(data=DF.Vec,aes(x=x,y=y))+geom_point(color="blue",size=0.5,alpha=1)+theme_bw()+xlab(lab[1])+ylab(lab[2])+geom_line(data=DF.Vec,aes(x=x,y=y),color="blue",size=1.0,alpha=1)+scale_colour_discrete(name = "Variable")
  lab<-c(lab[2],"Count") 
  gpbar<-ggplot(data=DF.Vec,aes(y))+geom_histogram(data=DF.Vec,aes(y =(..count..)/(sum(..count..))),size=1,color="blue",fill="white",binwidth=bsize)+theme_bw()+xlab(lab[1])+ylab(lab[2])+scale_colour_discrete(name = "Variable") 
 
  FileName<-paste(Name,"_2d_series.png",sep="")
  print(gp2d)
  ggsave(filename=FileName,plot=gp2d,dpi=330,width=8,height=5.21)
  
  FileName<-paste(Name,"_2d_hist.png",sep="")
  ggsave(filename=FileName,plot=gpbar,dpi=330,width=8,height=5.21)   
  
  return(c(gp2d,gpbar))
  dev.off()
  dev.off()
}

Save2D_DF<-function(DF,Name,x_set="",lab=c()){###multiple
  #set_col<-get_tick_M(DF,Col=F,x_set)
  bsize<-1 
  DFc<-data.frame(cbind(id=seq(1,nrow(DF),1),DF))
  if (length(lab)==0){lab<-c("x","y")}
  DFm<-melt(DFc,id.vars="id")
  gp2d<-ggplot(data=DFm,aes(x=id,y=value,color=factor(variable)))+geom_point(size=1,alpha=1)+xlab(lab[1])+ylab(lab[2])+theme_bw()+geom_line(data=DFm,aes(x=id,y=value,color=variable))+scale_colour_discrete(name = "Variable")#s(x=id,y=value,color=factor(variable)),size=1.5,alpha=1)
  lab<-c(lab[2],"Count")
  gpbar<-ggplot(data=DFm)+geom_density(aes(x=as.numeric(value),color=variable,fill=variable),alpha=0.15)+xlab(lab[1])+ylab(lab[2])+theme_bw()+scale_colour_discrete(name = "Variable")
  FileName<-paste(Name,"_2d_series.png",sep="")
  ggsave(filename=FileName,plot=gp2d,dpi=330,width=6.25,height=5.21)
  
  FileName<-paste(Name,"_2d_hist.png",sep="")
  ggsave(filename=FileName,plot=gpbar,dpi=330,width=6.25,height=5.21) 
  return(c(gp2d,gpbar))
  dev.off()
  dev.off()
}

SaveVolc<- function(Matrix,Name,x_set="",y_set="",lab=c("x","y","z")){
  # colnames(Matrix)<- get_tick_M(Matrix,T,x_set )
  #rownames(Matrix)<- get_tick_M(Matrix,F,y_set )
  FileName<-paste(Name,"_volcano.png",sep="",collapse=NULL)
  wire<- wireframe(Matrix, shade = TRUE,aspect = c(dim(Matrix)[1]/dim(Matrix)[2], 0.4),light.source = c(10,0,10),distance=0.4,scales = list(arrows = FALSE),xlab=lab[1],ylab=lab[2],zlab=lab[3])
  png(filename=FileName,bg="white",width = 4800, height = 4800, units = "px") 
  print(wire)
  dev.off()   
  return(wire)
}

SaveWire<-function(Matrix,Name,x_set="",y_set="",lab=c("x","y","z")){
  #colnames(Matrix)<- get_tick_M(Matrix,T,x_set )
  #rownames(Matrix)<- get_tick_M(Matrix,F,y_set )
  FileName<-paste(Name,"_wireframe.png",sep="")
  Matrix.m<-melt(Matrix)
  colnames(Matrix.m)<-c("x","y","z")
  wire<-wireframe(z ~ x * y, data = Matrix.m, scales = list(arrows = FALSE), drape = TRUE,colorkey=T,screen = list(z = 30, x = -60),xlab=lab[1],ylab=lab[2],zlab=lab[3],col.regions = colorRampPalette(c("white",  "steelblue"))(75))
  png(filename=FileName,bg="white",width = 4800, height = 4800, units = "px")
  print(wire)
  dev.off()
  return(wire)
}

SaveHeat <- function(Matrix,Name="Heat",x_set="",y_set="",type="",Normalize=F,NormalizeTyp="Z"){  
  #colnames(Matrix)<- get_tick_M(Matrix,T,x_set )
  #rownames(Matrix)<- get_tick_M(Matrix,F,y_set ) 
  Matrix.m<-melt(Matrix)
  if(Normalize){
    MEAN<-mean(Matrix.m[,3])
    SD<-sd(Matrix.m[,3]) 
    Temp.M<-switch(NormalizeTyp,
                   "Z"= sapply(Matrix.m[,3],z_score_2,Mean=MEAN,SD=SD) ,
                   Matrix.m$value)
    Matrix.m$value<-Temp.M
  }
  bsize<-12
  Matrix.m$value<-round(Matrix.m$value,2)    
  FileName<-paste(Name,"_heat.png",sep="")
  mainName<-paste("Heatplot of ",Name)
  Global.Text<-NULL 
  gg_heat<-ggplot(Matrix.m, aes(Var2, Var1)) + geom_tile(aes(fill = value),colour = "white") + scale_fill_gradient(low = "red",high = "yellow")+ggtitle(mainName)+xlab("Residue Position")+ylab("Residue Position")#+geom_text(aes(label =Global.Text,size=2))+xlab("Residue Position")+ylab("Residue Position")
  ggsave(filename=FileName,plot=gg_heat,dpi=330,width=6.25,height=5.21)
}
#3D Plot of data 
SaveSc3DHi <- function(Matrix=NULL,HLType="",Name="Scatterplot",x_set="",y_set="",lab=c("x","y","z"),g.box=F,Position=T){ 
  mat.m<-melt(Matrix)
  Sub<-NULL
  Sub<-HLMatrix(Matrix,HLType,Position)
  hlmat.m<-melt(Sub)
  colnames(mat.m)<-c(lab[1],lab[2],lab[3])
  #x_set<-seq(1,ncol(Matrix),1)#get_tick_M(Matrix,Col=T,x_set=x_set)
  #y_set<-seq(1,nrow(Matrix),1)#get_tick_M(Matrix,Col=F,y_set=y_set) 
  x<-(as.vector(unlist(mat.m[1])))
  y<-(as.vector(unlist(mat.m[2])))
  z<-(as.vector(unlist(mat.m[3])))
  seq<-seq(1,ncol(Matrix),1)
  FileName<-paste(Name,"_Sc3D.png")
  png(filename=FileName,bg="white",width = 4800, height = 4800, units = "px")
  print({ 
    s3d<-scatterplot3d(x,y,z,type="p",highlight.3d = TRUE,pch=20,box=g.box,main=Name,xlab=lab[1],ylab=lab[2],zlab=lab[3])
    s3d$points3d(as.vector(unlist(hlmat.m[1])),as.vector(unlist(hlmat.m[2])),as.vector(unlist(hlmat.m[3])),col="blue",type="h",pch=8)
    for (i in 1:length(x)) text(s3d$xyz.convert(x[i]+0.02,y[i]+0.02,z[i]+0.05),cex=0.75,labels=(as.vector(Sub))[i])
    for (i in 1:length(seq)) s3d$points3d(seq,rep(seq[i],length(seq)),Matrix[,i],type="l" )
    for (i in 1:length(seq)) s3d$points3d(rep(seq[i],length(seq)),seq,Matrix[i,],type="l" )
  })
  dev.off() 
}

#set ticks of plots if necessary (use sparingly)
get_tick_V<-function(Vec,Set=""){
  if(length(Set)!=""){
    prefix<-seq(1,length(Vec),1)
    suffix<-Set
    set_col<-as.vector(matrix(paste(prefix,suffix,sep=""),ncol=length(Vec))[1,])  
  }
  else{
    set_col<-seq(1,length(Vec),1)
  }
  return(set_col)
}
get_tick_M<-function(Matrix,Col=T,Set=""){ 
  if((length(Set)>0)|(Set!="")){
    if(Col){
      prefix<-as.character(seq(1,ncol(Matrix),1))
      suffix<-Set
      set_col<-as.vector(matrix(paste(prefix,suffix,sep=""),ncol=ncol(Matrix)))    
      
    }else{
      prefix<-as.character(seq(1,nrow(Matrix),1))
      suffix<-Set
      set_col<-as.vector(matrix(paste(prefix,suffix,sep=""),nrow=nrow(Matrix))[,1])    
      
    }
  }else{
    if(Col){
      set_col<-seq(1,ncol(Matrix),1)}   
    else{ 
      set_col<-seq(1,nrow(Matrix),1)} 
  }
  
  return(set_col)
}

#Highlightning Function for matrizen as text output
HLMatrix<-function(Matrix,type="",Position=F){  
  switch(type,
         mean={
           Matrix[Matrix<=mean(Matrix,na.rm=T)]<-0
           Matrix<-round(Matrix,2)
           Matrix[Matrix==0]<-""},
         median={
           Matrix[Matrix<=median(Matrix,na.rm=T)]<-0
           Matrix<-round(Matrix,2)
           Matrix[Matrix==0]<-""},
         p75={
           Matrix[Matrix<=mean(c(mean(Matrix,na.rm=T),max(Matrix,na.rm=T)))]<-0
           Matrix<-round(Matrix,2)
           Matrix[Matrix==0]<-""},
         p75.median={
           Matrix[Matrix<=median(c(mean(Matrix,na.rm=T),max(Matrix,na.rm=T)))]<-0
           Matrix<-round(Matrix,2)
           Matrix[Matrix==0]<-""}, 
         default=Matrix[]<-"")  
  colnames(Matrix)<-rownames(Matrix)<-seq(1,ncol(Matrix),1)
  #Set "i:j:value" for easy 
  if (Position){
    Matrix.S<-matrix(data=NA,nrow=nrow(Matrix),ncol=ncol(Matrix))
    for (i in 1:ncol(Matrix)){
      for (j in 1:nrow(Matrix)){
        if(Matrix[j,i]!=""){
          Matrix.S[j,i]<-paste(i,":",j,":",sep="",collapse=NULL)
        }else{
          Matrix.S[j,i]<-""
        }
      }
    }    
    Data<-paste(Matrix.S,Matrix,sep="",collapse=NULL)
    Matrix<-matrix(data=Data,nrow=nrow(Matrix.S),ncol=ncol(Matrix.S))
  }  
  return(Matrix)
}
